package com.anfeng.cms.service.impl.emp;

import com.anfeng.cms.common.Common;
import com.anfeng.cms.domain.emp.AfFaceInfo;
import com.anfeng.cms.repository.mysql.dao.emp.AfFaceInfoMapper;
import com.anfeng.cms.request.emp.EmployeeFaceInfoReq;
import com.anfeng.cms.service.emp.IAfFaceInfoService;
import com.anfeng.cms.util.IdGeneratorUtil;
import com.anfeng.cms.util.JsonMapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.sql.CommonDataSource;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author 吴朋
 * @since 2019-07-15
 */
@Service
@Slf4j
public class AfFaceInfoServiceImpl extends ServiceImpl<AfFaceInfoMapper, AfFaceInfo> implements IAfFaceInfoService {

    /**
     * 新增员工人脸信息
     *
     * @param afFaceInfo 人脸信息
     * @return 新增数据id
     */
    @Override
    public String addFaceInfo(AfFaceInfo afFaceInfo) {
        if (null == afFaceInfo) {
            log.error("新增员工人脸信息失败 参数传入为null");
            return null;
        }
        // 根据员工号查询是否存在人脸信息
        AfFaceInfo faceInfo = this.getFaceInfoByEmpNo(afFaceInfo.getEmpNo());
        if (faceInfo != null) {
            log.info("已经存在员工人脸信息 {}", JsonMapper.defaultMapper().toJson(faceInfo));
            return faceInfo.getId();
        }
        // 不存在 新增
        String faceId = IdGeneratorUtil.uuid();
        afFaceInfo.setId(faceId);
        afFaceInfo.setState(Common.DATA_STATE_NORMAL);
        Date currentDate = new Date();
        afFaceInfo.setCreateTime(currentDate);
        afFaceInfo.setModifiedTime(currentDate);
        boolean insert = this.insert(afFaceInfo);
        if (!insert) {
            log.error("新增员工人脸信息失败 {}", JsonMapper.defaultMapper().toJson(afFaceInfo));
            return null;
        }
        return faceId;
    }

    /**
     * 根据员工号获取人脸信息
     *
     * @param empNo 员工编号
     * @return 人脸信息
     */
    @Override
    public AfFaceInfo getFaceInfoByEmpNo(String empNo) {
        if (StringUtils.isBlank(empNo)) {
            log.error("根据员工号查询数据 参数传入为null");
            return null;
        }
        AfFaceInfo afFaceInfo = new AfFaceInfo();
        afFaceInfo.setEmpNo(empNo);
        afFaceInfo.setState(Common.DATA_STATE_NORMAL);
        EntityWrapper<AfFaceInfo> wrapper = new EntityWrapper<>();
        wrapper.setEntity(afFaceInfo);
        return this.selectOne(wrapper);
    }

    /**
     * 根据查询条件获取人脸数据信息的条数
     *
     * @param faceInfoReq 请求参数
     * @return 总数量
     */
    @Override
    public int getFaceInfoCounts(EmployeeFaceInfoReq faceInfoReq) {
        EntityWrapper<AfFaceInfo> wrapper = this.generatorFaceInfoWrapper(faceInfoReq);
        return this.selectCount(wrapper);
    }

    /**
     * 根据查询条件获取人脸数据信息
     *
     * @param faceInfoReq 请求条件
     * @return 获取的结果
     */
    @Override
    public List<AfFaceInfo> getFaceInfos(EmployeeFaceInfoReq faceInfoReq) {
        EntityWrapper<AfFaceInfo> faceWrapper = this.generatorFaceInfoWrapper(faceInfoReq);
        return this.selectList(faceWrapper);
    }

    /**
     * 分页获取人脸信息数据
     *
     * @param faceInfoReq 请求参数
     * @param page        页数
     * @param pageSize    每页展示数据数量
     * @return 获取的信息
     */
    @Override
    public List<AfFaceInfo> getFaceInfosByPage(EmployeeFaceInfoReq faceInfoReq, Integer page, Integer pageSize) {
        if (null == page || page < 1) {
            page = 1;
        }
        if (null == pageSize || pageSize < 10) {
            pageSize = 10;
        }

        Page<AfFaceInfo> faceInfoPage = new Page<>();
        faceInfoPage.setCurrent(page);
        faceInfoPage.setSize(pageSize);

        EntityWrapper<AfFaceInfo> entityWrapper = this.generatorFaceInfoWrapper(faceInfoReq);
        Page<AfFaceInfo> infoPage = this.selectPage(faceInfoPage, entityWrapper);
        if (null == infoPage || null == infoPage.getRecords() || infoPage.getRecords().isEmpty()) {
            return Collections.EMPTY_LIST;
        }
        return infoPage.getRecords();
    }

    /**
     * 根据员工编号和图片id更新员工人脸信息
     *
     * @param empNo   员工编号
     * @param photoId 图片id
     * @return 是否修改成功   -1 失败  1 成功
     */
    @Override
    public int updateFaceInfoPhoto(String empNo, String photoId) {
        if (StringUtils.isBlank(empNo) || StringUtils.isBlank(photoId)) {
            log.error("更新员工人脸信息失败 传入参数为null");
            return Common.RETURN_FAILED;
        }
        AfFaceInfo faceInfo = this.getFaceInfoByEmpNo(empNo);
        if (faceInfo == null) {
            log.error("更新头像信息 根据员工号查询人脸信息 未存在 {}", empNo);
            return Common.RETURN_FAILED;
        }
        // 判断是否存在头像
        if (StringUtils.isBlank(faceInfo.getPhotoId())) {
            faceInfo.setPhotoId(photoId);
        }
        faceInfo.setModifiedTime(new Date());
        boolean update = this.updateById(faceInfo);
        if (!update) {
            log.error("更新员工人脸信息失败 {}", JsonMapper.defaultMapper().toJson(faceInfo));
            return Common.RETURN_FAILED;
        }
        return Common.RETURN_SUCCESS;
    }

    /**
     * 根据员工编号 更新员工基础照片
     *
     * @param empNo   员工编号
     * @param photoId 基础照片Id
     * @return 是否成功
     */
    @Override
    public int updateFaceInfoBasicPhoto(String empNo, String photoId) {
        if (StringUtils.isBlank(empNo) || StringUtils.isBlank(photoId)) {
            log.error("更新员工基础照片失败 传入参数为null");
            return Common.RETURN_FAILED;
        }
        AfFaceInfo faceInfo = this.getFaceInfoByEmpNo(empNo);
        if (faceInfo == null) {
            log.error("更新头像信息 根据员工号查询人脸信息 未存在 {}", empNo);
            return Common.RETURN_FAILED;
        }
        faceInfo.setPhotoId(photoId);
        faceInfo.setModifiedTime(new Date());
        boolean update = this.updateById(faceInfo);
        if (!update) {
            log.error("更新员工基础照片失败 {}", JsonMapper.defaultMapper().toJson(faceInfo));
            return Common.RETURN_FAILED;
        }
        return Common.RETURN_SUCCESS;
    }

    /**
     * 根据查询条件生成wrapper
     *
     * @param faceInfoReq 查询条件
     * @return wrapper
     */
    private EntityWrapper<AfFaceInfo> generatorFaceInfoWrapper(EmployeeFaceInfoReq faceInfoReq) {
        if (null == faceInfoReq) {
            faceInfoReq = new EmployeeFaceInfoReq();
        }
        AfFaceInfo faceInfo = new AfFaceInfo();
        faceInfo.setEmpName(faceInfoReq.getEmpName());
        faceInfo.setMobile(faceInfoReq.getMobile());
        faceInfo.setDeptId(faceInfoReq.getDeptId());
        faceInfo.setEmpNo(faceInfoReq.getEmpNo());
        faceInfo.setStatus(faceInfoReq.getStatus());

        EntityWrapper<AfFaceInfo> faceWrapper = new EntityWrapper<>();
        faceWrapper.setEntity(faceInfo);
        faceWrapper.isNotNull("photo_id");
        faceWrapper.orderBy("modified_time", false);
        return faceWrapper;
    }
}
